﻿#ifndef _BASEROLE_H_INCLUDE_
#define _BASEROLE_H_INCLUDE_

#include <QString>
#include <QRect>
#include <QList>
#include <QPoint>
#include <QWebSocket>
#include <QMap>

#include "common.h"

class BaseRole
{
public:
    BaseRole(RoleType type=ROLETYPE_PLAYER);
    ~BaseRole();

    /// 设置角色的唯一ID
    inline void setID(int id) { mID = id; }
    /// 得到角色的唯一ID
    inline int getID(void) { return mID; }
    /// 设置角色名称
    inline void setName(QString name) { mName = name; }
    /// 得到角色名称
    inline QString getName(void) { return mName; }
    /// 设置角色当前坐标
    inline void setPosition(QPoint pos)
    {
        if(mPosition != pos)
            mPosIsChanged = true;
        else
            mPosIsChanged = false;

        mPosition = pos;
    }
    /// 得到角色当前坐标
    inline QPoint getPosition(void)
    {
        return mPosition;
    }
    /// 设置角色当前角度
    inline void setAngle(float angle)
    {
        if(mAngle != angle)
            mAngleIsChanged = true;
        else
            mAngleIsChanged = false;

        mAngle = angle;
    }
    /// 得到角色当前角度
    inline float getAngle(void) { return mAngle; }
    /// 检测角色状态是否改变
    inline bool isStateChanged(void) { return mStateIsChanged; }
    /// 设置角色状态是否改变
    inline void setStateChanged(bool changed)
    {
        mStateIsChanged = changed;

        if(changed == false)
        {
            mAngleIsChanged=mPosIsChanged=false;
        }
    }
    /// 检测角色角度是否改变
    inline bool isAngleChanged(void) { return mAngleIsChanged; }
    /// 检测角色位置是否改变
    inline bool isPosChanged(void) { return mPosIsChanged; }
    /// 设置角色类型
    inline void setRoleType(RoleType type) { mRoleType = type; }
    /// 得到角色类型
    inline RoleType getRoleType(void) { return mRoleType; }
    /// 设置活动状态
    void setState(RoleState state);
    /// 得到活动状态
    inline RoleState getState(void) { return mRoleState; }
    /// 得到当前状态保持时间
    qint64 getStateTime(void);
    /// 设置角色的血量
    inline void setBlood(int blood) { mBlood = blood; if(msrcBlood == 0) msrcBlood = mBlood; }
    /// 得到角色的血量
    inline int getBlood(void) { return mBlood; }
    /// 得到角色的原始血量
    inline int getsrcBlood(void) { return msrcBlood; }
    /// 设置角色的防御
    inline void setDefense(int defense) { mDefense = defense; }
    /// 得到角色的防御
    inline int getDefense(void) { return mDefense; }
    /// 设置活动范围
    inline void setActivityRect(QRect rect) { mActivityRect = rect; }
    /// 得到活动范围
    inline QRect getActivityRect() { return mActivityRect; }
    /// 设置角色可视范围
    inline void setViewRect(QRect rect) { mViewRect = rect; }
    /// 得到角色可视范围
    inline QRect getViewRect(void) { return mViewRect; }
    /// 设置角色在地图中的可视范围
    inline void setMapViewRect(QRect rect) { mMapViewRect = rect; }
    /// 得到角色在地图中的可视范围
    inline QRect getMapViewRect(void) { return mMapViewRect; }
    /// 设置角色当前所在地图区域
    inline void setCurMapTile(int index) { mCurMapTile = index; }
    /// 得到角色当前所在地图区域
    inline int getCurMapTile(void) { return mCurMapTile; }
    /// 设置角色以前所在地图区域
    inline void setLastMapTile(int index) { mLastMapTile = index; }
    /// 得到角色以前所在地图区域
    inline int getLastMapTile(void) { return mLastMapTile; }
    /// 设置角色的形状信息
    inline void setShape(QString info) { mShapeInfo = info; }
    /// 得到角色的形状信息
    inline QString getShape(void) { return mShapeInfo; }
    /// 设置角色所在地图索引
    inline void setMapIndex(int index) { mMapIndex = index; }
    /// 得到角色所在地图索引
    inline int getMapIndex(void) { return mMapIndex; }
    /// 设置角色关联socket
    inline void setWebSocket(QWebSocket *socket) { mClient = socket; }
    /// 得到角色关联socket
    inline QWebSocket* getWebSocket(void) { return mClient; }
    /// 设置角色经验值
    inline void setExperience(int e) { mExperience = e; }
    /// 得到角色经验值
    inline int getExperience(void) { return mExperience; }
    /// 设置角色的自愈能力
    inline void setSelfHealing(float healing) { mSelfhealing = healing; }
    /// 得到角色的自愈能力
    inline float getSelfHealing(void) { return mSelfhealing; }
    /// 得到角色自愈能力累计
    inline float getSelfHealingTotal(void) { return mSelfhealingtotal; }
    /// 设置角色的等级
    inline void setGrade(int grade) { mGrade = grade; }
    /// 得到角色的等级
    inline int getGrade(void) { return mGrade; }
    /// 设置角色的逃跑率
    inline void setEscaperate(int rate) { mEscaperate = rate; }
    /// 得到角色的逃跑率
    inline int getEscaperate(void) { return mEscaperate; }

    /// 添加一个角色到可视角色列表中
    bool addRole(BaseRole *role);
    /// 添加一组角色到可视列表中
    bool addRoles(QList<BaseRole*> roles);
    /// 从可视角色列表中删除指定角色
    bool delRoleFromViewList(BaseRole *role);
    /// 清空可视角色列表
    void clearRoleList(void);
    /// 检测指定角色是否存在列表中
    bool isExistRole(BaseRole *role);
    /// 清除不在指定范围内的所有角色
    QList<BaseRole*> delRoleNoRect(QRect rect);
    /// 设置当前可以使用的子弹
    inline void setUsingBullets(QVector<int> bullets) { mUsingBullets = bullets; }
    /// 得到当前使用的子弹
    inline QVector<int>& getUsingBullets(void) { return mUsingBullets; }
    /// 设置可以使用的子弹数量
    inline void setBulletQuantity(int id,int quantiy) { mBulletQuantity[id] = quantiy; }
    /// 得到可以使用的子弹数量
    inline QMap<int,int>& getBulletQuantity(void) { return mBulletQuantity; }
    /// 得到指定ID子弹的数量
    inline int getBulletQuantityById(int id) { return mBulletQuantity[id]; }
    /// 设置当前使用子弹
    inline void setUsingBullet(int id) { mCurrentUsingBullet = id; }
    /// 得到当前使用子弹
    inline int getUsingBullet(void) { return mCurrentUsingBullet; }

    /// 得到当前角色可以看见所有其它角色
    QList<BaseRole*> getViewRoleList(RoleType type=ROLETYPE_NULL);

    /// 更新
    virtual void update(void) {}

protected:
    int mID;                          /**< 角色的唯一ID */
    QWebSocket *mClient;              /**< 角色关联socket */
    QString mName;                    /**< 角色名称 */
    QPoint mPosition;                 /**< 角色当前坐标 */
    int mMapIndex;                    /**< 角色所在地图索引 */
    int mBlood,msrcBlood;             /**< 角色所拥有的血量 */
    int mDefense;                     /**< 角色所拥有的防御 */
    int mExperience;                  /**< 角色所拥有的经验值 */
    float mAngle;                     /**< 角色当前角度 */
    int mGrade;                       /**< 角色当前等级 */
    int mEscaperate;                  /**< 角色当前逃跑率 */
    int mCurMapTile;                  /**< 角色当前所在地图区域 */
    int mLastMapTile;                 /**< 角色以前所在地图区域 */
    RoleType mRoleType;               /**< 角色类型 */
    QString mShapeInfo;               /**< 角色的形状信息 */
    QRect mViewRect;                  /**< 角色可视范围 */
    QList<BaseRole*> mViewRoleList;   /**< 可视范围内的角色列表 */
    QRect mMapViewRect;               /**< 角色在地图中的可视范围 */
    QRect mActivityRect;              /**< 角色活动范围 */
    bool mStateIsChanged,mAngleIsChanged,mPosIsChanged;             /**< 角色状态是否改变，改变的才发送数据 */

    RoleState mRoleState;             /**< 角色状态 */
    qint64 mRoleStateStartTime;       /**< 用于计算角色状态保持时间 */
    qint64 mWalkingMaxTime;           /**< 行走目标坐标最大时间 */
    float mWaokingAngle;              /**< 行走角度 */

    QVector<int> mUsingBullets;       /**< 可以使用的子弹 */
    QMap<int,int> mBulletQuantity;    /**< 可以使用的子弹数量 */
    int mCurrentUsingBullet;          /**< 当前使用的子弹 */

    float mSelfhealing;               /**< 自愈能力 */
    float mSelfhealingtotal;          /**< 自愈能力累计 */
};

#endif // BASEROLE_H
